上一篇比較了 EC2、Container 與 Lambda,當應用程式已經打包成容器映像檔(Container Image),下一個問題我們來看看:到底該用 ECS、EKS,還是 Fargate?
這三個服務常被放在一起比較,但其實不是同一層的選項。
可以先拆成兩個問題:
誰負責管理 Container?
│
├── ECS
└── EKS
Container 跑在哪裡?
│
├── EC2
└── Fargate
也就是:先選容器編排平台(Container Orchestration),再選底層運算資源。
Container 數量一多,就會遇到:
這些事情就是 容器編排(Container Orchestration) 要處理的。
AWS 上常見的選擇就是 ECS 與 EKS。
Amazon ECS 是 AWS 原生的容器編排服務。
ECS 常見三個概念:
| 名詞 | 用途 |
|---|---|
| Task Definition(任務定義) | 描述映像檔、CPU、記憶體、Port 等執行設定 |
| Task(任務) | 根據 Task Definition 啟動的執行單位,可包含一個或多個容器 |
| Service(服務) | 維持指定數量的 Task 持續執行 |
例如:
ECS Service
Desired Count = 3
│
├── Task A
├── Task B
└── Task C
如果 Task B 停止,ECS Service 會再啟動新的 Task,讓數量回到 3。
因此:
如果系統主要部署在 AWS,團隊只是需要管理 Container、接 ALB、自動擴展,而且沒有 Kubernetes 相依需求,就可以優先評估 ECS。
Amazon EKS 是 AWS 提供的受管 Kubernetes 服務。
如果團隊已經具備 Kubernetes 維運經驗,並且現有部署流程依賴 Helm Chart、Operator 或 Kubernetes API,使用 EKS 就能延續既有工具與管理方式。
如果公司也要求不同環境採用一致的 Kubernetes 平台標準,這會是選擇 EKS 的另一個理由。
補充說明
- Helm Chart:將 Kubernetes 的部署設定整理成可重複使用的套件,透過範本與參數,讓同一套應用程式能以不同設定部署到開發、測試或正式環境。
- Operator:將特定軟體的維運知識寫成程式,持續監看狀態並自動執行管理工作,例如安裝、升級或備份;實際支援哪些功能,取決於該 Operator 的實作。
- Kubernetes API 相依:應用程式或平台需要透過 Kubernetes API 查詢或管理資源,例如動態建立 Pod、調整 Deployment。這些功能依賴 Kubernetes,換到其他容器平台時就需要調整。
例如原本已有:
On-Premises Kubernetes
│
├── Helm
├── Operator
└── Deployment YAML
搬到 AWS 後繼續使用 EKS,就能延續原有的 Kubernetes 操作方式。
但如果團隊只有 Docker Image 與幾個 API,沒有 Kubernetes 經驗,若未經準備直接使用 EKS,反而可能會造成運維負擔,而且 ECS 一樣可以管理大量 Container。
另外,EKS 雖然由 AWS 管理 Kubernetes 控制平面(Control Plane),但 RBAC、Deployment、網路設定、附加元件(Add-on)與版本升級等 Kubernetes 工作,仍然需要團隊處理。
所以欲使用 EKS 的話,請慎重評估 團隊是不是真的需要 Kubernetes?
接著看最容易混淆的 Fargate。
Fargate 不負責 Container 編排,它負責提供 Container 執行時需要的運算資源。
例如 ECS 可以搭配:
ECS
│
├── EC2
└── Fargate
EKS 也可以搭配不同的 Compute 模式。
所以這邊來回應一下標題的問題,真正要比較的是 ECS vs EKS,以及 EC2 vs Fargate,而不是把 ECS、EKS、Fargate 當成三選一。
如果 Container 跑在 EC2,團隊可以自己控制:
也可以把多個 Container 安排到同一批 EC2 上,提高資源利用率。
但同時也要管理:
Fargate 則把底層主機管理交給 AWS。
團隊仍然需要負責:
但不需要自己維護承載 Container 的 EC2。
因此,如果沒有 GPU、特殊主機設定等需求,而且希望減少 Server 維護,Fargate 通常會是很自然的選擇。
反過來,如果需要 GPU、特權容器(Privileged Container)、特定主機能力,或已經有成熟的 EC2 維運流程,就可以考慮使用 EC2 型運算資源。
假設 ECS Service 從 2 Tasks 擴展成 6 Tasks,如果底層使用 EC2,還要確認目前的 EC2 Capacity 是否放得下新增的 Task。
所以其實有兩層擴展:
應用程式擴展(Application Scaling)
Task 2 → 6
│
▼
運算容量擴展(Compute Scaling)
底層 Capacity 是否足夠?
Fargate 可以減少這一層主機容量管理,但仍要注意服務配額(Service Quota)、子網路可用 IP 與下游資料庫或其他服務的承載能力。
假設一個新系統有:
可以優先評估看看:ECS + Fargate
API 使用 ECS Service,批次工作使用獨立任務(Standalone Task)。
選 ECS,是因為目前沒有 Kubernetes 相依需求。
選 Fargate,是因為這是新環境,沒有特殊主機需求,也希望減少主機維護;後續仍要透過負載測試,確認資源配置與執行成本是否符合預算。
如果團隊已有成熟的 EC2 維運流程,或能讓一批主機長期維持良好的使用率,就應把 ECS + EC2 一起比較。
可以把整個判斷流程整理成:
| 現有條件 | 優先評估 |
|---|---|
| 新環境、没有特殊主機需求,希望減少主機維護 | ECS + Fargate |
| 已有成熟的 EC2 更新、監控與容量管理流程 | ECS + EC2 |
| 需要 EC2 的彈性,也希望減少部分主機管理 | ECS Managed Instances |
| 已有 Kubernetes 平台規範與管理能力 | EKS,再選擇適合的運算模式 |
最後初步就先記得:
把這兩層拆開之後,ECS、EKS 與 Fargate 的選擇就會清楚很多。
當 Application 處理一筆 Request 時,如果還要寄信、更新庫存、通知物流,這些工作一定要全部同步完成嗎?
下一篇會進入 SQS、SNS 與 EventBridge,看看佇列(Queue)、發布/訂閱(Pub/Sub)與事件路由(Event Routing)分別適合什麼情境。